#ifndef IWINDOWIMPL_H
#define IWINDOWIMPL_H

#include "RenderTarget.h"

NS_B2D_BEGIN

class IGraphicContext;


typedef void* WindowHandle;


////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Window options.
////////////////////////////////////////////////////////////////////////////////////////////////////
struct B2D_API WindowOptions final
{
	string title;
	ivec2 position;
	uvec2 size;
	bool fullscreen;

	int depthBits;
	int colorBits;

	WindowOptions(void)
		: title("b2d")
		, position(0,0)
		, size(640, 480)
		, fullscreen(false)

		, depthBits(32)
		, colorBits(32)
	{
	}
};

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Window render target
/// 		Platform-specific functions delegated to implementation.
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API BaseWindow
	: public RenderTarget
{
protected:
	IGraphicContext* mContext;

	bool mExternalWindow;
	string mTitle;
	ivec2 mPosition;
	bool mFullscreen;
	int mDepthBits;
	int mColorBits;

public:
	BaseWindow(void);
	virtual ~BaseWindow(void) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets window handle.
	///
	/// \return	The window handle.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual WindowHandle getWindowHandle(void) const = 0;
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the window title.
	///
	/// \return	The title.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	const string& getTitle(void) const { return mTitle; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets the window title.
	///
	/// \param	title	The title.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void setTitle(const string& title) { mTitle = title; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the position (offset from top-left).
	///
	/// \return	The position.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	const ivec2& getPosition(void) const { return mPosition; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets the window position.
	///
	/// \param	pos	The position.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void move(const ivec2& pos) { mPosition = pos; }


	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	If an external window is provided, this is responsible for managing its own double-
	/// 		buffering, etc...
	///
	/// \return	true if external window, false if not.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool isExternalWindow(void) const { return mExternalWindow; }

	// ::RenderTarget
	virtual void render(IGraphicsDevice& g) const;
};

NS_B2D_END

#endif